const {ccclass, property} = cc._decorator;

@ccclass
export default class Menu_Game extends cc.Component {

    @property(cc.Node)
    canvas: cc.Node = null;

    @property({displayName: "菜单节点", tooltip: "菜单节点", type: cc.Node})
    menu_parent: cc.Node = null;

    @property({displayName: "打开菜单按钮", tooltip: "打开菜单按钮", type: cc.Node})
    open_btn: cc.Node = null;

    @property({displayName: "关闭菜单按钮", tooltip: "关闭菜单按钮", type: cc.Node})
    close_btn: cc.Node = null;

    @property({displayName: "背景音乐滑动器", tooltip: "背景音乐滑动器", type: cc.Slider})
    BGM_sd: cc.Slider = null;

    @property({displayName: "音效滑动器", tooltip: "音效滑动器", type: cc.Slider})
    sound_effect_sd: cc.Slider = null;

    @property({displayName: "帧数滑动器", tooltip: "帧数滑动器", type: cc.Slider})
    FPS_sd: cc.Slider = null;

    @property({displayName: "抗锯齿复选按钮", tooltip: "抗锯齿复选按钮", type: cc.Toggle})
    anti_aliasing_btn: cc.Toggle = null;

    @property({displayName: "背景音乐", tooltip: "背景音乐", type: cc.AudioSource})
    BGM: cc.AudioSource = null;

    // 菜单节点初始位置
    start_pos: cc.Vec3 = cc.v3();


    // 设置相关数据
    set_data = {
        bgm: 1,
        sound: 1,
        FPS: 1,
        anti_aliasing: true,
        /* 
        背景音乐
        音效
        帧数
        抗锯齿
         */
    };

    
    start () {
        // 应用设置
        this.SET();
    }


    onLoad () {
        // 删除已经有的设置相关数据
        // cc.sys.localStorage.removeItem("set_data");

        // 获取设置数据
        // let data = JSON.parse(cc.sys.localStorage.getItem("set_data"));
        /* // 如果设置数据为空
        if (data == null) {
            // 初始化
            cc.sys.localStorage.setItem("set_data", JSON.stringify(this.set_data));
            cc.log("设置数据初始化");
            cc.log(JSON.parse(cc.sys.localStorage.getItem("set_data")));
        } 
        // 如果不为空
        else {
            // 应用所有设置
            this.SET();
            this.BGM_sd.progress = data.bgm;
            this.sound_effect_sd.progress = data.sound;
            this.FPS_sd.progress = data.FPS;
            this.anti_aliasing_btn.isChecked = data.anti_aliasing;
            cc.log(data);
        } */
        



        // 将菜单节点移动到屏幕最上方

        

        /*
        let t = h;
        let d = -h;
        let l = -w;
        let r = w;
        */

        // 应用设置
        this.SET();

        // canvas宽一半
        let w = this.canvas.width / 2;
        // canvas高一半
        let h = this.canvas.height / 2;

        // 菜单节点宽一半
        let w_ = this.menu_parent.width / 2;
        // 菜单节点高一半
        let h_ = this.menu_parent.height / 2;

        // 将菜单移动到屏幕最上方
        this.menu_parent.position = cc.v3(0, h + h_);
        // 记录下初始坐标
        this.start_pos = this.menu_parent.position;
    }


    // 打开设置菜单专用函数   设置按钮函数
    open_onbtn () {
        // 显示菜单节点
        this.menu_parent.active = true;

        // 动作和缓动
        let move = cc.moveTo(1, cc.v2(0, 0)).easing(cc.easeBackOut());
        // 执行
        this.menu_parent.runAction(move);

        // 禁用和启用打开和关闭按钮
        this.open_btn.getComponent(cc.Button).interactable = false;
        this.close_btn.getComponent(cc.Button).interactable = true;
    }


    // 关闭设置菜单   关闭按钮函数
    close_onbtn () {
        let self = this;

        // 动作和缓动
        let move = cc.moveTo(1, cc.v2(this.start_pos)).easing(cc.easeBackOut());
        let f = cc.callFunc(function () {
            // 禁用和启用关闭和打开按钮
            self.open_btn.getComponent(cc.Button).interactable = true;
            self.close_btn.getComponent(cc.Button).interactable = false;
        });

        // 两个动作放到一块
        let action = cc.sequence(move, f);

        // 执行
        this.menu_parent.runAction(action);
        
    }


    // 将所有设置生效
    // 不包括音效
    SET () {
        // 获取设置数据
        let data = JSON.parse(cc.sys.localStorage.getItem("set_data"));

        // 设置背景音乐
        let BGM = data.bgm;
        this.BGM.volume = BGM;
        // this.BGM_sd.progress = BGM;
        cc.log("应用背景音乐设置");

        // 设置帧数
        let fps = (data.FPS + 0.5) * 60;
        cc.game.setFrameRate(fps);
        cc.log("应用帧数设置");

        // 设置抗锯齿
        let k = data.anti_aliasing;
        cc.view.enableAntiAlias(k);
        // this.anti_aliasing_btn.isChecked = k;
        cc.log("应用抗锯齿设置");
        cc.log(data);

        // 将设置的数据在UI上生效
        this.BGM_sd.progress = data.bgm;
        this.sound_effect_sd.progress = data.sound;
        this.FPS_sd.progress = data.FPS;
        this.anti_aliasing_btn.isChecked = data.anti_aliasing;
    }


    // 保存所有设置
    save_data () {
        // 获取当前设置数据
        let d = {
            bgm: this.BGM_sd.progress,
            sound: this.sound_effect_sd.progress,
            FPS: this.FPS_sd.progress,
            anti_aliasing: this.anti_aliasing_btn.isChecked,
            /* 
            背景音乐
            音效
            帧数
            抗锯齿
            */
        };
        // 存起来
        cc.sys.localStorage.setItem("set_data", JSON.stringify(d));
        // cc.log(this.sound_effect_sd.progress);
    }


    // 一键测试函数
    test () {
        let a = this.BGM.volume;
        let b = this.sound_effect_sd.progress;
        let c = this.FPS_sd.progress;
        let d = cc.view.isAntiAliasEnabled();
        cc.log("一键测试结果如下   背景音乐 " + a + "音效 " + b + "帧数 " + c + "抗锯齿" + d);
    }


    // 删除数据函数
    delete () {
        // 删除已经有的设置相关数据
        cc.sys.localStorage.removeItem("set_data");
    }


    // 返回开始界面函数
    onbtn_back_start () {
        cc.director.loadScene("Start");
    }

    // 返回村庄函数
    onbtn_back_village () {
        cc.director.loadScene("Village");
    }



}
